/**
 * @File Name: queue.h
 * @brief  循环队列
 * @Author : LiWanglin email:lwl510ll@163.com
 * @Version : 1.0
 * @Creat Date : 2023-07-18
 * 
 * @copyright Copyright (c) 2023 LiWanglin
 */

#ifndef DATA_STRCUT_QUEUE
#define DATA_STRCUT_QUEUE

#ifdef __cplusplus
extern "C"
{
#endif

#include "common.h"

typedef struct _queue {
    cm_uint8 *buf;          // 队列空间基地址
    cm_uint16 buf_max_len;  // buf 最大长度
    cm_int16 rear;          // 尾指针
    cm_int16 front;         // 头指针
    cm_bool coverage_flag;  // 数据覆盖标志位
} queue;

queue *queue_init(cm_uint16 buf_max_len, err_code *err);
queue *queue_uninit(queue *q);
cm_int16 queue_en(queue *q, const cm_uint8 *data, cm_uint16 len);
cm_int16 queue_de(queue *q, cm_uint8 *data, cm_uint16 len);
err_code queue_de_all(queue *q, cm_uint8 *data, cm_uint16 *len);
cm_int16 queue_get_cur_len(queue *q);
cm_int16 queue_get_max_len(queue *q);
err_code queue_clear(queue *q);

#ifdef __cplusplus
}
#endif

#endif /* DATA_STRCUT_QUEUE */

